<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <div class="c1">
      <div title="title1">name: {{obj.name}}</div>
      <div title="title2">age: {{obj.age}}</div>
      <div title="title3">sex: {{obj.sex}}</div>
      <ul>
        <li>{{name}}</li>
        <li>{{age}}</li>
        <li>{{sex}}</li>
      </ul>
    </div>
  </div>
  <!-- 必须保证引用的正确性 -->
  <script src="./watcher.js"></script>
  <script src="./vnode.js"></script>
  <script src="./compiler.js"></script>
  <script src="./jgvue.js"></script>
  <script src="./initrender.js"></script>
  <script src="./initdata.js"></script>
  <script>
    // 打包工具rollup
    let app = new JGVue({
      el: '#root',
      data: {
        name: '张',
        age: 'dan',
        sex: '女',
        obj: {
          name: 'obj的name',
          age: 'obj的age',
          sex: 'obj的sex'
        },
        children: [
          {name: '11'},
          {name: '22'},
          {name: '33'}
        ]
      }
    })

  </script>
  <script>
    /*
    改写observe 函数
    无法处理数组，响应式无法在中间击沉watcher处理，
    我们实现的reactify和我们的vue实例紧紧的绑在一起了，解耦


    ????vue2存在一个缺陷，目前data中的数组以及数组中的每一项都是响应式的
    但是如果要给数组的某一项重新赋值，则不是响应式的，需要用到vue3的Proxy对象
    app.children[0] = {name: 'eee', age: 30}就不是响应式的
    vue2中推荐使用$set方法，但是我们这里还没有这个功能
     app.children[0].splice(0, 1, {}),这么处理就是一个响应式的了
    */
  </script>
  <script>
    /*
    存在的问题： 
    this
    watcher 模型图，computed和watch都是watcher
    1.只考虑修改后刷新（响应式核心）
    2.在考虑依赖收集（优化）

    在vue中提供一个构造函数watcher，watcher会提供一些方法：
    get（）计算或执行处理函数，
    update（）公共的外部方法，该方法会触发内部的run（）方法
    run（）运行，会判断内部是使用异步运行还是同步运行等
    run最终会调用get方法
    cleanupDep()清除队列，例如更新watcher之后清除watcher

    页面渲染是哪个方法执行的，get方法。

    watcher实例有个属性，vm，表示的是当前的vue实例，
    */
  </script>
</body>
</html>